昨天我們介紹了 Enum 與 Protocol。
今天要來看看 Swift 中幾個更進階、也更常見的功能:集合型別 (Collection)、泛型 (Generics) 與 錯誤處理 (Error Handling)。
Swift 主要有三種集合型別:Array、Set、Dictionary。
用來儲存相同型別的資料,並且 保留順序(索引從 0 開始)。
var fruits: [String] = ["蘋果", "香蕉", "櫻桃"]
fruits.append("Durian")
print(fruits[1]) // 香蕉
用來儲存 不重複的元素,元素之間沒有順序。
var numbers: Set<Int> = [1, 2, 3, 3, 2]
print(numbers) // {1, 2, 3}
用來儲存 Key-Value 對應關係,可以快速透過 key 查找 value。
var scores: [String: Int] = ["Tom": 80, "Mary": 95]
scores["Jerry"] = 70
print(scores["Mary"]!) // 95
集合支援許多「高階函式」,能大幅減少程式碼量,以下為常用的幾個。
範例:
let numbers = [1, 2, 3, 4, 5]
// map:每個數字平方
let squared = numbers.map { $0 * $0 } // [1, 4, 9, 16, 25]
// filter:挑出偶數
let evens = numbers.filter { $0 % 2 == 0 } // [2, 4]
// reduce:加總所有數字
let sum = numbers.reduce(0) { $0 + $1 } // 15
這些工具讓 Swift 的程式碼更簡潔、直觀。
泛型讓程式碼更通用,可以避免重複撰寫同樣邏輯的函式或型別。
func swapValues<T>(_ a: inout T, _ b: inout T) {
let temp = a
a = b
b = temp
}
var x = "Hello"
var y = "World"
swapValues(&x, &y) // x = World, y = Hello
如果需要處理兩個不同型別,可以宣告多個泛型參數:
func merge<T, U>(_ a: T, _ b: U) -> String {
return "\(a) \(b) is a string"
}
var x = 10
var y = "Month"
print(merge(x, y)) // 10 Month is a string
透過 throw / try / catch
機制來處理錯誤情境。
enum NetworkError: Error {
case badURL
case timeout
}
func fetchData(from url: String) throws -> String {
guard url.starts(with: "https") else {
throw NetworkError.badURL
}
return "OK"
}
do {
let data = try fetchData(from: "http://test.com")
print(data)
} catch {
print("發生錯誤:\(error)")
}
今天我們學到了 Swift 四個進階功能:
Array
、Set
、Dictionary
throw / try / catch
處理錯誤